#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <png.h>
#include "defs.h"
#include  <stddef.h>
#include <stdint.h>
#include "./readbitmap.h"
#include "memory.h"
png_structp png_ptr=NULL; //libpng的结构体
png_infop   info_ptr=NULL; //libpng的信息
extern unsigned char *image_buffer;
extern int image_buffer_index;
int write_png(char *destPath,int pic_w,int pic_h){
    int iRetVal;
    png_ptr=png_create_write_struct(PNG_LIBPNG_VER_STRING,NULL,NULL,NULL);
    if(!png_ptr)
       printf("png_ptr is NULL");
    info_ptr=png_create_info_struct(png_ptr);
    if(!info_ptr)
    {
        png_destroy_write_struct(&png_ptr,NULL);
        printf("info_ptr is NULL");
    }
    // iRetVal=setjmp(png_jmpbuf(png_ptr));//安装错误处理跳转点
    // //当libpng内部出现错误的时候，libpng会调用longjmp直接跳转到这里运行。
    // if(iRetVal)//setjmp的返回值就是libpng跳转后提供的错误代码（貌似总是1，但是还是请大家看libpng的官方文档）
    // {
    //     fprintf(stderr,"错误码：%d\n",iRetVal);
    // }
    FILE*fp=fopen(destPath,"wb");
    if(!fp)
        printf("the write png file fp is NULL");
        
    png_init_io(png_ptr,fp);

    //设置PNG文件头
    png_set_IHDR(png_ptr,info_ptr,
        pic_w,pic_h,//尺寸
        8,//颜色深度，也就是每个颜色成分占用位数（8表示8位红8位绿8位蓝，如果有透明通道则还会有8位不透明度）
        PNG_COLOR_TYPE_RGB,//颜色类型，PNG_COLOR_TYPE_RGB表示24位真彩深色，PNG_COLOR_TYPE_RGBA表示32位带透明通道真彩色
        PNG_INTERLACE_NONE,//不交错。PNG_INTERLACE_ADAM7表示这个PNG文件是交错格式。交错格式的PNG文件在网络传输的时候能以最快速度显示出图像的大致样子。
        PNG_COMPRESSION_TYPE_BASE,//压缩方式
        PNG_FILTER_TYPE_BASE);//这个不知道，总之填写PNG_FILTER_TYPE_BASE即可。
    png_set_packing(png_ptr);//设置打包信息
    png_write_info(png_ptr,info_ptr);//写入文件头
    unsigned char * row_pointer[0];
    int scanline=0;
 
    row_pointer[0] = &image_buffer[scanline*pic_w*3];

    while (scanline<pic_h)
    {
         png_write_row(png_ptr,row_pointer);
         scanline++;
          row_pointer[0] = &image_buffer[scanline*pic_w*3];
    }
    

  

    png_write_end(png_ptr,info_ptr);
    png_destroy_write_struct(&png_ptr,&info_ptr);
    return 0;
}

int compress_one_png_block(  char * destpath,int ***data){
  
    
    image_buffer=(uint8_t *)calloc(3*PIC_W*PIC_H,sizeof(uint8_t));
    image_buffer_index=0;
    memset(image_buffer,0,PIC_W*PIC_H*3);
    int index[1];
    int j=0,k=0,i=0;
   
    int offset=0;
    for ( i = 0; i < block32; i++){
        for(j=0;j<block32;j++){
        /* code */
        image_buffer[image_buffer_index++]=data[i][j][0]+offset;
        image_buffer[image_buffer_index++]=data[i][j][1]+offset;
        image_buffer[image_buffer_index++]=data[i][j][2]+offset;
        }
    }
    printf("total data size %d \n",image_buffer_index);
    write_png(destpath,block32,block32);
    return 0;
}

int test_blocks(){
    char * destpath="./tmp/block_residual.png";
    int *** data=readBlock("./block_residual");
    compress_one_png_block(destpath,data);

    char * destpath1="./tmp/block.png";
    int *** data1=readBlock("././block.input");
    compress_one_png_block(destpath1,data);
}